package com.courir.data;

import static com.courir.Predefined.listOf;

import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;

import lombok.RequiredArgsConstructor;
import lombok.val;
import au.com.bytecode.opencsv.CSVReader;

import com.google.common.collect.Iterators;
import com.google.common.io.Closeables;
import com.google.common.io.Files;

/**
 * CSV einlesen und in Teilnehmer parsen.
 * 
 * @author giese
 */
@RequiredArgsConstructor
public class CsvReader {
	/** Csv-zeichensatz. */
	private final Charset cs = Charset.forName("IBM850");

	/**
	 * Liste der Teilnehmer aus der CSV ermitteln.
	 */
	public List<Teilnehmer> read(File path) throws IOException {
		val ts = new ArrayList<Teilnehmer>();
		val csv = new CSVReader(Files.newReader(path, cs), ';');
		try {
			for (val data : csv.readAll()) {
				val l = new CsvLine(Iterators.forArray(data));
				Teilnehmer t = Teilnehmer.Empty;
				t = t.withLauf(l.nextLauf());
				t = t.withStartnummer(l.nextInt());
				t = t.withName(l.next());
				t = t.withVorname(l.next());
				l.skip(); // String?
				l.skip(); // String?
				l.skip(); // int?
				l.skip(); // String?
				t = t.withGeburtsdatum(l.nextYear());

				// altersgruppe - nur für das geschlecht
				t = t.withGeschlecht(l.nextGeschlecht());

				l.skip(); // irgendeine zahl. platzierung?
				l.skip(); // nichts
				t = t.withVerein(new Verein(l.next()));
				l.skip(); // string?
				l.skip(); // int?
				t = t.withZeit(l.nextTime());
				ts.add(t);
			}
			return listOf(ts);
		} finally {
			Closeables.closeQuietly(csv);
		}
	}
}
